package org.example.project.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import org.example.project.dao.entity.ShortLinkDO;
import org.example.project.dto.req.ShortLinkCreatReqDTO;
import org.example.project.dto.req.ShortLinkPageReqDTO;
import org.example.project.dto.req.ShortLinkUpdateReqDTO;
import org.example.project.dto.resp.GroupShortLinkCountRespDTO;
import org.example.project.dto.resp.ShortLinkCreateRespDTO;
import org.example.project.dto.resp.ShortLinkPageRespDTO;

import java.io.IOException;
import java.util.List;

/**
 * @author weibin
 * @since 2025/10/5 0:10
 */
public interface ShortLinkService extends IService<ShortLinkDO> {

    /**
     * 创建短链接
     *
     * @param requestParam  创建短链接请求参数
     * @return  创建短链接响应数据
     */
    ShortLinkCreateRespDTO createShortLink(ShortLinkCreatReqDTO requestParam);

    /**
     * 分页查询某个分组下的短链接
     *
     * @param requestParam  分页查询某个分组下的短链接请求参数
     * @return  短链接分页返回
     */
    IPage<ShortLinkPageRespDTO> pageShortLink(ShortLinkPageReqDTO requestParam);

    /**
     * 获取分组内短链接数量
     *
     * @param requestParam  获取分组内短链接数量请求参数
     * @return  分组内短链接数量返回
     */
    List<GroupShortLinkCountRespDTO> listGroupShortLinkCount(List<String> requestParam);

    /**
     * 修改短链接
     * 这里注意一下：
     * domain\short_uri\full_short_uri这3个是不能被修改的
     * 我们所谓的修改短链接其实是修改基本消息，而这三个消息是绑定的，经过我们工具类生产得到的，所以不能改
     * 这个domain不能改是因为domain + short_uri = full_short_uri，而full_short_uri是不能改的，所以domain也不能改，否则数据不一致了
     * <p>
     * 此外我再说一下，获取要修改的这条链接你别使用记录的主键，由于现在分表了，你得使用上分片键
     *
     * @param requestParam  修改短链接请求参数
     */
    void updateShortLink(ShortLinkUpdateReqDTO requestParam);

    /**
     * 路由短链接到原始链接地址
     *
     * @param shortUri  短链接
     * @param request   HTTP 请求
     * @param response  HTTP 响应
     */
    void routerShortUri(String shortUri, ServletRequest request, ServletResponse response) throws IOException;
}
